package com.cskaoyan.thread02.model.edition2;

/*
    为什么，多个生产者线程，和多消费者线程的时候(如果使用notify方法)，此时，会出现"卡死的情况"？

      假设现在，其他3个线程都 因为wait方法处于阻塞状态，假设现在只有做包子的1线程在执行,
      假设现在蒸笼里没有包子
      1.  做包子的1线程，看了下蒸笼为空，做包子，通知别人，假设用notify选择的是
          选择的是做包子的2线程来执行
      2.  做包子的线程2，被唤醒，执行，看了下有包子，做包子的线程2阻塞自己
      3.  现在只有做包子的线程1，开始执行，一看，有包子，阻止自己

     如何解决这个问题呢？  当有多个生产者和消费者的线程后，通知别人的时候使用notifyAll方法即可


面试题：
Thread.sleep  VS Object.wait()
    1. 所属不同：
        a. sleep定义在Thread类，静态方法
        b. wait定义在 Object类中，非静态方法

    2. 唤醒条件不同
        a. sleep: 休眠时间到
        b. wait: 在其他线程中，在同一个锁对象上，调用了notify或notifyAll方法

    3. 使用条件不同：
        a. sleep 没有任何前提条件
        b. wait(), 必须当前线程，持有锁对象，锁对象上调用wait()

    4. 休眠时，对锁对象的持有，不同：（最最核心的区别）
      a. 线程因为sleep方法而处于阻塞状态的时候，在阻塞的时候不会放弃对锁的持有
      b. 但是wait()方法，会在阻塞的时候，放弃锁对象持有
 */
public class Test {

    public static void main(String[] args) {
        // 创建蒸笼
        Container container = new Container();

        // 创建生产者和消费者任务
        ConsumerTask consumerTask = new ConsumerTask(container);
        ProducerTask producerTask = new ProducerTask(container);

        new Thread(consumerTask, "吃包子的人1").start();
        new Thread(consumerTask,"吃包子的人2").start();
        new Thread(producerTask, "做包子的人1").start();
        new Thread(producerTask, "做包子的人2").start();

    }
}
